# 异常
# 语法错误、异常
# 语法错误：缩进错误、少写了一个引号、关键字拼写错误......SyntaxError

# 六大常见的异常
# 除零异常
# 10 / 0 # ZeroDivisionError

# 名称异常
# print(a)  # NameError: name 'a' is not defined

# 类型异常
int1 = 10
str1 = '10'

# print(int1 + str1) # TypeError: unsupported operand type(s) for +: 'int' and 'str'

# 值异常
str2 = 'abc'
# int(str2)  # ValueError: invalid literal for int() with base 10: 'abc'

# 索引异常
list1 = [1, 2, 3, 4]
# list1[5]  # IndexError: list index out of range

# 属性异常
tuple1 = (1, 2, 3, 4)
# tuple1.append() # AttributeError: 'tuple' object has no attribute 'append'

# 异常处理
'''
try:
    可能会发生异常的代码
    可能会发生异常的代码
except 可能会发生的异常1 as e:
    针对发生了异常1的处理逻辑
except 可能会发生的异常2 as e:
    针对发生了异常2的处理逻辑
......
else:
    没有发生异常才会执行
finally:
    不管有没有发生异常都会执行
'''

try:
    10 / 0  # 一旦发生异常会直接跳出当前try语句块
    print("没有异常")
except ZeroDivisionError as e:  # 一旦捕获到了对应的异常 则会跳过后面的except语句块
    print(e)
    print("请检查除数是否为0")
except AttributeError as e:
    print(e)
else:
    print("如果没有发生异常则会执行")
finally:
    print("不管有没有发生异常都会执行")

# 自定义异常
# 例如：判断age是否小于0，小于0 直接抛出AgeError
age = -1


class AgeError(Exception):
    pass


# 抛出异常
# raise
try:
    if age < 0:
        raise AgeError
except AgeError as e:
    print("捕获到了AgeError")
except ZeroDivisionError as e:  # 一旦捕获到了对应的异常 则会跳过后面的except语句块
    print(e)
    print("请检查除数是否为0")

print("当前模块没有任何异常，或者异常已被处理")
